home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / vesacode / vesa.asm < prev    next >
Assembly Source File  |  1996-02-13  |  29KB  |  919 lines

  1. ; =========================================================
  2. ; = VESA - Intro                                          =
  3. ; =                                                       =
  4. ; = coded by zan in jan '96                               =
  5. ; =========================================================
  6.  
  7. .model tiny
  8. .386
  9. locals
  10. .code
  11.  
  12. org 100h
  13.  
  14.  
  15. ; ---------------------------------------------------------
  16. ; Konstanten
  17. ; ---------------------------------------------------------
  18.    stars           equ 300
  19.    centerx         equ 320
  20.    centery         equ 240
  21.    centerxy        equ centerx shl 16+centery
  22.    distancez       equ 200
  23.    weiss           equ 255
  24.    digitalxsize    equ  10
  25.    digitalysize    equ  10
  26.    digitalspace    equ   5
  27.  
  28.  
  29. ; ---------------------------------------------------------
  30. ; Hauptprogramm
  31. ; ---------------------------------------------------------
  32. begin:
  33.          cld                            ; go ahead, fred
  34.  
  35.          call cleardata                 ; COM-Datei wurde verkürzt, deshalb
  36.                                         ; ist der Datenbereich in einem
  37.                                         ; undefiniertem Zustand
  38.          call check386                  ; min. 386er
  39.          jc  ende
  40.  
  41.          call savepalette               ; Palette retten
  42.  
  43.          mov si,offset originalpalette  ; ausfaden
  44.          call fadeout
  45.  
  46.          call initmode                  ; VESA-Mode 101h testen
  47.          jc  ende
  48.  
  49.          call initdata                  ; Tabellen usw. initialisieren
  50.  
  51.          call palblack                  ; Palette schwarz
  52.          call fillscreen                ; Hintergrund aufbauen
  53.  
  54.          mov ecx,190 shl 16+(centery-3*digitalysize)
  55.          mov dx,64                      ; Telefonnummern Teil 1
  56.          mov si,offset phonedigital1
  57.          call digitaltext
  58.  
  59.          mov ecx,190 shl 16+(centery+digitalysize)
  60.          mov si,offset phonedigital2    ; Telefonnummern Teil 2
  61.          call digitaltext
  62.  
  63.  
  64.          mov si,offset newpalette       ; einfaden
  65.          call fadein
  66.  
  67. @@angle:
  68.          call showpoints                ; 3D-Feld anzeigen
  69.  
  70.          inc anglex                     ; Winkel verändern
  71.          inc angley
  72.          inc anglez
  73.  
  74.          mov ah,1                       ; Tastaturstatus auslesen
  75.          int 16h
  76.          jnz @@raus                     ; Taste gedrückt ?
  77.  
  78.          call retrace                   ; Retrace abwarten
  79.  
  80.          jmp short @@angle              ; nächstes Bild
  81.  
  82. @@raus:
  83.          xor ah,ah                      ; Tastaturpuffer leeren
  84.          int 16h
  85.  
  86.          mov si,offset newpalette
  87.          call fadeout                   ; ausfaden
  88.  
  89.          mov ax,3                       ; in Textmodus schalten
  90.          int 10h
  91.          call palblack                  ; Palette vorsichtshalber schwarz
  92.  
  93. ende:
  94.          mov ah,9                       ; Telefonnummern anzeigen
  95.          mov dx,offset phonenumbers
  96.          int 21h
  97.  
  98.          mov si,offset originalpalette  ; einfaden
  99.          call fadein
  100.  
  101.          mov ah,4Ch                     ; Shutdown
  102.          int 21h
  103.  
  104.  
  105.  
  106. ; ---------------------------------------------------------
  107. ; CLEARDATA: füllt Datenbereich mit Nullen
  108. ; ---------------------------------------------------------
  109. cleardata proc near
  110.          push bx
  111.  
  112.          mov bx,offset endofzeros+1     ; Endelabel
  113.          sub bx,offset startofzeros     ; Startlabel
  114. @@data2zero:
  115.          mov byte ptr startofzeros[bx],0; mit 0 überschreiben
  116.          dec bx                         ; nächstes Byte
  117.          jnz @@data2zero                ; fertig ?
  118.  
  119.          pop bx
  120.          ret
  121. cleardata endp
  122.  
  123.  
  124. ; ---------------------------------------------------------
  125. ; CHECK386: testet auf 386 bzw. Nachfolger
  126. ; ---------------------------------------------------------
  127. check386 proc near
  128.          push ax
  129.  
  130.          xor ax,ax                      ; 0000hex pushen
  131.          push ax
  132.          popf                           ; als Flags laden
  133.          pushf                          ; und wieder sichern
  134.          pop ax                         ; in AX
  135.          and ax,0F000h                  ; nur Bits 12 bis 15 interessant
  136.          cmp ax,0F000h                  ; alle gesetzt ?
  137.          je @@error            ; ist 8086/8088/V20/V30
  138.  
  139.          mov ax,7000h                   ; 7000hex pushen
  140.          push ax
  141.          popf                           ; als Flags laden
  142.          pushf                          ; und wieder sichern
  143.          pop ax                         ; als AX wiederholen
  144.          and ah,70h                     ; überprüfen
  145.          jz  @@error                    ; nicht verändert => ist 286
  146.          clc
  147.  
  148.          jmp short @@raus               ; Bereinigungcode ausführen
  149. @@error:
  150.          mov ah,9                       ; god bless u
  151.          mov dx,offset cpu386
  152.          int 21h
  153.          stc
  154. @@raus:
  155.          pop ax
  156.          ret
  157. check386 endp
  158.  
  159.  
  160. ; ---------------------------------------------------------
  161. ; INITMODE: initialisiert Mode 101h
  162. ; ---------------------------------------------------------
  163. initmode proc near
  164.          pushad
  165.  
  166.          push cs                        ; auf VESA-Treiber prüfen
  167.          pop es                         ; Segment der Tabelle laden
  168.          mov di,offset infoblock        ; Offset laden
  169.          mov ax,4F00h                   ; Info-Unterfunktion
  170.          int 10h                        ; Interrupt aufrufen
  171.  
  172.          cmp ax,004Fh                   ; VESA vorhanden ? Test 1
  173.          jne @@error
  174.          cmp dword ptr infoblock[0],'ASEV'
  175.          jne @@error                    ; VESA vorhanden ? Test 2
  176.  
  177.          mov ax,4F01h                   ; Modus 101h unterstützt ?
  178.          mov cx,101h
  179.          int 10h
  180.          cmp ax,004Fh
  181.          jne @@error
  182.  
  183.          mov eax,dword ptr infoblock[0Ch]
  184.          or  eax,eax
  185.          jz  @@error
  186.          mov vesaptr,eax                ; FAR-CALL Zeiger
  187.  
  188.          mov ax,word ptr infoblock[4]   ; Granularität auf 64k testen
  189.          cmp ax,64
  190.          jne @@error
  191.  
  192.          mov ax,4F02h                   ; Modus einstellen
  193.          mov bx,101h
  194.          int 10h
  195.  
  196.          clc
  197.          jmp short @@raus
  198. @@error:
  199.          mov ah,9                       ; omigod
  200.          mov dx,offset problem
  201.          int 21h
  202.          stc
  203. @@raus:
  204.          popad
  205.          ret
  206. initmode endp
  207.  
  208.  
  209. ; ---------------------------------------------------------
  210. ; INITDATA: initialisiert alle Tabellen
  211. ; ---------------------------------------------------------
  212. initdata proc near
  213.          pushad
  214.  
  215.          xor ecx,ecx                    ; bei Y=0 anfangen
  216. @@calc_yoffset:
  217.          imul eax,ecx,640               ; Offset berechnen
  218.          mov yoffset[bx],eax            ; und sichern
  219.          add bx,4                       ; ist DWord = 4 Bytes
  220.          inc cx                         ; nächste Zeile
  221.          cmp cx,479                     ; fertig ?
  222.          jna @@calc_yoffset
  223.  
  224.  
  225.          xor bx,bx                      ; Laufindex, bei 0 anfangen
  226. @@randomize:
  227.          call random                    ; Zufallsgenerator
  228.          sar ah,1                       ; auf -63..+63 beschränken
  229.          mov pointxtab[bx],ah           ; und sichern
  230.  
  231.          call random                    ; Zufallsgenerator
  232.          sar ah,1                       ; auf -63..+63 beschränken
  233.          mov pointytab[bx],ah           ; und sichern
  234.  
  235.          call random                    ; Zufallsgenerator
  236.          sar ah,1                       ; auf -63..+63 beschränken
  237.          mov pointztab[bx],ah           ; und sichern
  238.  
  239.          inc bx                         ; nächster Punkt
  240.          cmp bx,stars                   ; fertig ?
  241.          jne @@randomize
  242.  
  243.  
  244.          xor bx,bx                      ; wieder Laufindex
  245. @@calc_cosinus:
  246.          mov si,63                      ; Cosinus aus Sinus aufbauen
  247.          sub si,bx                      ; 1.Quadrant Cosinus umgekehrt Sinus
  248.          mov al,sinustab[si]
  249.          mov cosinustab[bx],al
  250.          neg al                         ; 256-Cosinus
  251.          mov cosinus_3[bx],al           ; 3.Quadrant
  252.  
  253.          mov al,sinustab[bx]            ; Sinuswert laden
  254.          mov cosinus_4[bx],al           ; 4.Quadrant Cosinus
  255.          neg al                         ; 256-Sinus
  256.          mov cosinus_2[bx],al           ; 2.Quadrant
  257.  
  258.          inc bl                         ; nächster Winkel
  259.          cmp bl,64                      ; fertig ?
  260.          jne @@calc_cosinus
  261.  
  262.  
  263.          xor bx,bx                      ; Palette aufbauen
  264.          xor cl,cl
  265. @@palette_loop1:
  266.          mov newpalette[bx+2],cl        ; nur blau
  267.          inc cl
  268.          add bl,3
  269.          cmp cl,64
  270.          jne @@palette_loop1
  271.  
  272.          mov word ptr newpalette[3*255],63 shl 8+63
  273.                                         ; weiß
  274.          mov newpalette[3*255+2],63
  275.  
  276.  
  277.          mov ax,0A000h                  ; ES ist immer 0A000h
  278.          mov es,ax
  279.  
  280.          popad
  281.          ret
  282. initdata endp
  283.  
  284.  
  285. ; ---------------------------------------------------------
  286. ; SHOWPOINTS: zeichnet neues Bild
  287. ; ---------------------------------------------------------
  288. showpoints proc near
  289.          pushad
  290.  
  291.          xor bx,bx                      ; Laufindex Byte
  292.          xor bp,bp                      ; Laufindex DWord
  293. @@loop:
  294.          mov dl,oldcolor[bx]            ; alte Farbe holen
  295.          cmp dl,weiss                   ; doppelt gezeichnet ?
  296.          je  @@doppelt
  297.          mov ecx,screen2d[bp]           ; alten Koordinaten holen
  298.          call putpixel
  299.  
  300. @@doppelt:
  301.          mov al,pointxtab[bx]           ; Urpsrungskoordinaten holen
  302.          mov ah,pointytab[bx]
  303.          mov cl,pointztab[bx]
  304.  
  305.          movzx si,anglez                ; um Z-Achse drehen
  306.          mov dl,sinustab[si]
  307.          mov dh,cosinustab[si]
  308.          call rotate
  309.  
  310.          xchg ah,cl
  311.          movzx si,angley                ; um Y-Achse drehen
  312.          mov dl,sinustab[si]
  313.          mov dh,cosinustab[si]
  314.          call rotate
  315.          xchg ah,cl
  316.  
  317.          xchg al,cl
  318.          movzx si,anglex                ; um X-Achse drehen
  319.          mov dl,sinustab[si]
  320.          mov dh,cosinustab[si]
  321.          call rotate
  322.          xchg al,cl
  323.  
  324.          movsx dx,cl                    ; auf 2D umrechnen
  325.          movsx cx,al
  326.          shl ecx,16
  327.          movsx cx,ah
  328.          call conv3d
  329.  
  330.          call setwindow
  331.          mov dl,weiss                   ; weißer Punkt
  332.          xchg es:[di],dl
  333.          mov oldcolor[bx],dl
  334.          mov screen2d[bp],ecx           ; für Wiederherstellung XY sichern
  335.  
  336.          add bp,4                       ; Laufindexe anpassen
  337.          inc bx
  338.          cmp bx,stars                   ; fertig ?
  339.          jne @@loop
  340.  
  341.          popad
  342.          ret
  343. showpoints endp
  344.  
  345.  
  346. ; ---------------------------------------------------------
  347. ; CONV3D: konvertiert 3D-Koordinaten in 2D
  348. ; -> ECX  X,Y
  349. ; -> DX   Z
  350. ; <- ECX  X,Y der 2D-Form
  351. ; ---------------------------------------------------------
  352. conv3d proc near
  353.          push ax
  354.          push bx
  355.          push dx
  356.          push si
  357.  
  358.          add dx,distancez-1             ; etwas Distanz zum Betrachter schaffen
  359.          or  dx,dx                      ; Division durch 0 verhindern
  360.          js  @@div0                     ; negatives Z, nicht sichtbar
  361.          inc dx
  362.  
  363.          mov si,dx                      ; Z sichern
  364.  
  365.          mov ax,cx                      ; X holen
  366.          shr ecx,16
  367.          sal ax,8                       ; anpassen
  368.          cwd                            ; DX mit Vorzeichen füllen
  369.          idiv si                        ; durch Z dividieren
  370.          mov bx,ax                      ; und sichern
  371.  
  372.          mov ax,cx                      ; Y holen
  373.          sal ax,8                       ; anpassen
  374.          cwd                            ; DX mit Vorzeichen füllen
  375.          idiv si                        ; durch Z dividieren
  376.  
  377.          shrd ecx,eax,16                ; 2D-X in obere Hälfte von ECX
  378.          mov cx,bx                      ; 2D-Y holen
  379.          add ecx,centerxy               ; zentrieren
  380.          jmp short @@nodiv0             ; Division-durch-0-Routine überspringen
  381.  
  382. @@div0:  mov ecx,640 shl 16+480         ; irgendein nicht sichtbarer Punkt
  383. @@nodiv0:
  384.          pop si
  385.          pop dx
  386.          pop bx
  387.          pop ax
  388.          ret
  389. conv3d endp
  390.  
  391.  
  392. ; ---------------------------------------------------------
  393. ; ROTATE: rotiert um eine Achse
  394. ; -> AX  X,Y bzw. Z  (insgesamt 2 Werte)
  395. ; -> DL  Sinus
  396. ; -> DH  Cosinus
  397. ; <- AX  neue X,Y bzw. Z
  398. ; ---------------------------------------------------------
  399. rotate proc near
  400.          push cx
  401.          push bx
  402.  
  403.          push ax
  404.  
  405.          mov bx,ax                      ; Xneu = X*cos-Y*sin
  406.          imul dh
  407.          mov cx,ax
  408.          mov al,bh
  409.          imul dl
  410.          sub cx,ax
  411.  
  412.          pop ax
  413.          imul dl                        ; Yneu = X*sin+Y*cos
  414.          xchg bx,ax
  415.          mov al,ah
  416.          imul dh
  417.          add ax,bx
  418.  
  419.          sal cx,1                       ; Xneu und Yneu runterrechnen, da
  420.          sal ax,1                       ; Sinus und Cosinus -127..+127 statt
  421.                                         ; -1..+1
  422.          mov al,ch
  423.  
  424.          pop bx
  425.          pop cx
  426.          ret
  427. rotate endp
  428.  
  429.  
  430. ; ---------------------------------------------------------
  431. ; SETWINDOW: setzt das Fenster im VRAM
  432. ; -> ECX  X,Y
  433. ; <- DI   Offset
  434. ; ---------------------------------------------------------
  435. setwindow proc near
  436.          push ax
  437.          push bx
  438.          push ecx
  439.          push edx
  440.  
  441.          mov di,cx                      ; y holen
  442.          shl di,2                       ; auf DWORD ausrichten
  443.          mov edx,yoffset[di]            ; entsprechender 32-Bit-Offset
  444.  
  445.          shr ecx,16                     ; x addieren
  446.          add edx,ecx
  447.  
  448.          mov di,dx                      ; in Granularitätsoffset umrechnen
  449.  
  450.          shr edx,16                     ; Segmentanteil herausfiltern
  451.          cmp dx,vesaseg
  452.          je  @@ok
  453.          mov vesaseg,dx
  454.          xor bx,bx
  455.          call dword ptr vesaptr         ; Window setzen
  456. @@ok:
  457.          pop edx
  458.          pop ecx
  459.          pop bx
  460.          pop ax
  461.          ret
  462. setwindow endp
  463.  
  464.  
  465. ; ---------------------------------------------------------
  466. ; PUTPIXEL: setzt einen Punkt
  467. ; -> ECX   X,Y
  468. ; -> DL    Farbe
  469. ; ---------------------------------------------------------
  470. putpixel proc near
  471.          cmp cx,479                     ; Y vorzeichenlos über 479 ?
  472.          ja  @@do_not_set_any_pixel
  473.          cmp ecx,640 shl 16             ; X vorzeichenlos über 639 ?
  474.          jae @@do_not_set_any_pixel
  475.  
  476.          call setwindow                 ; Window setzen
  477.          mov es:[di],dl                 ; Punkt setzen
  478.  
  479. @@do_not_set_any_pixel:
  480.          ret
  481. putpixel endp
  482.  
  483.  
  484. ; ---------------------------------------------------------
  485. ; XLINE: zeichnet eine horizontale Linie
  486. ; -> ECX   X1,X2
  487. ; -> EDX   Y,Farbe
  488. ; ---------------------------------------------------------
  489. xline proc near
  490.          pushad
  491.  
  492.          mov bl,dl                      ; Farbe sichern
  493.          shr edx,16                     ; Y holen
  494.          mov bp,dx                      ; und sichern
  495.          mov dh,bl                      ; Farbe zurück
  496.  
  497.          mov eax,ecx                    ; X1 holen
  498.          shr eax,16
  499.          mov bx,cx                      ; X2 holen
  500.  
  501.          shrd ecx,eax,16                ; Startpunkt checken
  502.          mov cx,bp
  503.          call setwindow
  504.          cmp di,65535-640               ; Window-Break ?
  505.          jae @@window_break
  506.  
  507.          sub bx,ax                      ; schnelle Variante
  508.          inc bx
  509.          mov cx,bx                      ; Anzahl Punkte in der Linie
  510.          mov al,dh                      ; Farbe
  511.          rep stosb                      ; ausgeben
  512.          jmp short @@raus
  513.  
  514. @@window_break:
  515.          shl ebx,16                     ; langsame Variante
  516. @@loop:
  517.          call setwindow                 ; (ähnlich PUTPIXEL)
  518.          mov es:[di],dh
  519.  
  520.          add ecx,10000h                 ; nächstes X
  521.          cmp ecx,ebx                    ; fertig ?
  522.          jna @@loop
  523.  
  524. @@raus:
  525.          popad
  526.          ret
  527. xline endp
  528.  
  529.  
  530. ; ---------------------------------------------------------
  531. ; YLINE: zeichnet eine vertikale Linie
  532. ; -> ECX   Y1,Y2
  533. ; -> EDX   X,Farbe
  534. ; ---------------------------------------------------------
  535. yline proc near
  536.          pushad
  537.  
  538.          mov bx,cx                      ; Y2 sichern
  539.          shr ecx,16
  540.          mov ax,cx                      ; Y1 sichern
  541.  
  542.          mov ecx,edx                    ; X setzen
  543.          mov cx,ax                      ; Y1 setzen
  544. @@loop:
  545.          call setwindow                 ; Window anpassen
  546.          mov es:[di],dl                 ; Punkt setzen
  547.          inc cx                         ; nächstes Y
  548.          cmp cx,bx                      ; fertig ?
  549.          jna @@loop
  550.  
  551.          popad
  552.          ret
  553. yline endp
  554.  
  555.  
  556. ; ---------------------------------------------------------
  557. ; FILLSCREEN: füllt den gesamten Bildschirm mit Farbverlauf
  558. ; ---------------------------------------------------------
  559. fillscreen proc near
  560.          pusha
  561.  
  562.          xor ax,ax
  563.          xor edx,edx                    ; Farbe und Y setzen
  564.          mov ecx,639                    ; X1 und X2 setzen
  565. @@loop1:
  566.          call xline                     ; Linie zeichnen
  567.          inc al                         ; Farbe ändern
  568.          and al,3
  569.          jnz @@dontinc1
  570.          inc dl
  571. @@dontinc1:
  572.          add edx,10000h                 ; vorheriges Y
  573.          cmp edx,240 shl 16
  574.          jna @@loop1                    ; fertig ?
  575.  
  576. @@loop2:
  577.          call xline                     ; Linie zeichnen
  578.          inc al                         ; Farbe ändern
  579.          and al,3
  580.          jnz @@dontinc2
  581.          dec dl
  582. @@dontinc2:
  583.          add edx,10000h                 ; vorheriges Y
  584.          cmp edx,480 shl 16
  585.          jna @@loop2                    ; fertig ?
  586.  
  587.          popa
  588.          ret
  589. fillscreen endp
  590.  
  591.  
  592. ; ---------------------------------------------------------
  593. ; DIGITALCHAR: zeichnet ein Zeichen in Digitalschrift
  594. ; -> ECX   X,Y  (obere linke Ecke)
  595. ; ->  DH   DIGITAL-Code
  596. ; ->  DL   Farbe
  597. ; ---------------------------------------------------------
  598. digitalchar proc near
  599.          pushad
  600.  
  601.          mov ebp,ecx                    ; Koordinaten sichern
  602.  
  603.          mov ax,dx                      ; sichern
  604.  
  605.          mov si,0                       ; Laufindex
  606. @@loop_xline:
  607.          test ah,1                      ; unterstes Bit gelöscht ?
  608.          jz  @@nix_xline
  609.  
  610.          mov ecx,ebp                    ; Koordinaten holen
  611.          shr ecx,16                     ; X1 und X2 berechnen
  612.          push cx
  613.          inc cx
  614.          shl ecx,16
  615.          pop cx
  616.          add cx,digitalxsize-1
  617.  
  618.          imul dx,si,digitalysize        ; Y berechnen
  619.          add dx,bp
  620.          shl edx,16
  621.          mov dl,al                      ; Farbe holen
  622.  
  623.          call xline                     ; Linie zeichnen
  624.  
  625.          dec cx                         ; Parallelen zeichnen
  626.          add ecx,10000h
  627.          sub edx,10000h
  628.          call xline
  629.          add edx,20000h
  630.          call xline
  631.  
  632. @@nix_xline:
  633.          shr ah,1                       ; ein Bit weiterrücken
  634.          inc si
  635.          cmp si,2                       ; XLINEs fertig ?
  636.          jna @@loop_xline
  637.  
  638.  
  639.          mov si,0                       ; wieder Laufindex
  640. @@loop_yline:
  641.          test ah,1                      ; unterstes Bit testen
  642.          jz  @@nix_yline
  643.  
  644.          mov cx,bp                      ; Y1 und Y2 berechnen
  645.          inc cx
  646.          shl ecx,16
  647.          mov cx,bp
  648.          add cx,digitalxsize-1
  649.  
  650.          imul dx,si,digitalysize        ; X berechnen
  651.          mov edi,ebp
  652.          shr edi,16
  653.          add dx,di
  654.          shl edx,16
  655.          mov dl,al                      ; Farbe holen
  656.  
  657.          call yline                     ; Linie zeichnen
  658.  
  659.          dec cx                         ; Parallelen zeichnen
  660.          add ecx,10000h
  661.          sub edx,10000h
  662.          call yline
  663.          add edx,20000h
  664.          call yline
  665.  
  666. @@nix_yline:
  667.          shr ah,1                       ; ein Bit weiterrücken
  668.          inc si
  669.          cmp si,2                       ; 2.Y-Bit ?
  670.          jne @@noinc
  671.          add bp,digitalysize            ; jups, Y anpassen
  672.          sub ebp,(2*digitalxsize) shl 16
  673. @@noinc:
  674.          cmp si,3                       ; fertig ?
  675.          jna @@loop_yline
  676.  
  677.          popad
  678.          ret
  679. digitalchar endp
  680.  
  681.  
  682. ; ---------------------------------------------------------
  683. ; DIGITALTEXT: zeichnet eine Zeichenkette in Digitalschrift
  684. ; -> ECX   X,Y
  685. ; -> DL    Farbe
  686. ; -> SI    Offset des Textes
  687. ; ---------------------------------------------------------
  688. digitaltext proc near
  689.          pushad
  690.  
  691. @@loop:
  692.          mov dh,[si]                    ; ein Zeichen holen
  693.          cmp dh,'$'                     ; fertig ?
  694.          je  @@fertig
  695.  
  696.          call digitalchar               ; Zeichen ausgeben
  697.          inc si                         ; eins weiterrücken
  698.          add ecx,(digitalxsize+digitalspace) shl 16
  699.          jmp short @@loop               ; X anpassen, nächstes Zeichen
  700.  
  701. @@fertig:
  702.          popad
  703.          ret
  704. digitaltext endp
  705.  
  706.  
  707. ; ---------------------------------------------------------
  708. ; SAVEPALETTE: rettet die Originalpalette
  709. ; ---------------------------------------------------------
  710. savepalette proc near
  711.          pusha
  712.  
  713.          xor al,al
  714.          mov dx,3C7h                    ; Read-Adress auf Farbe 0
  715.          out dx,al
  716.          add dl,2                       ; auf Data-Port weiter
  717.  
  718.          mov cx,3*256                   ; 3*256 Farben
  719.          mov di,offset originalpalette  ; Tabelle bei CS:DI
  720.          segcs rep insb                 ; los geht's
  721.  
  722.          popa
  723.          ret
  724. savepalette endp
  725.  
  726.  
  727. ; ---------------------------------------------------------
  728. ; SETPALETTE: setzt eine temporäre Palette
  729. ; ---------------------------------------------------------
  730. setpalette proc near
  731.          pusha
  732.  
  733.          xor al,al                      ; bei Farbe 0 anfangen
  734.          mov dx,3C8h
  735.          out dx,al
  736.          inc dx
  737.  
  738.          mov cx,3*256                   ; 3*256 Farben
  739.          mov si,offset temppalette      ; Zeiger auf Tabelle
  740.          segcs rep outsb                ; und setzen
  741.  
  742.          popa
  743.          ret
  744. setpalette endp
  745.  
  746.  
  747. ; ---------------------------------------------------------
  748. ; PALBLACK: setzt die komplette Palette auf schwarz
  749. ; ---------------------------------------------------------
  750. palblack proc near
  751.          pusha
  752.  
  753.          xor al,al                      ; bei Farbe 0 anfangen
  754.          mov dx,3C8h
  755.          out dx,al
  756.          inc dx                         ; auf Datenport
  757.  
  758.          mov cx,3*256                   ; 768 Farbwerte
  759. @@loop:
  760.          out dx,al                      ; ausgeben
  761.          loop @@loop
  762.  
  763.          popa
  764.          ret
  765. palblack endp
  766.  
  767.  
  768. ; ---------------------------------------------------------
  769. ; FADEIN: sanftes Einfaden der Palette
  770. ; -> SI   Offset der Tabelle
  771. ; ---------------------------------------------------------
  772. fadein proc near
  773.          pusha
  774.  
  775.          xor cl,cl                      ; 64 Abstufungen
  776. @@frame_loop:
  777.          xor bx,bx                      ; 3*256 Farben
  778. @@color_loop:
  779.          movzx ax,[bx+si]               ; Farbwert holen
  780.          mul cl                         ; neu = alt*Stufe/64
  781.          shr ax,6
  782.          mov temppalette[bx],al
  783.  
  784.          inc bx                         ; nächste Farbe
  785.          cmp bx,3*256                   ; fertig ?
  786.          jne @@color_loop
  787.  
  788.          call retrace                   ; synchronisieren
  789.          call setpalette                ; ausgeben
  790.  
  791.          inc cl                         ; nächste Stufe
  792.          cmp cl,64
  793.          jna @@frame_loop
  794.  
  795.          popa
  796.          ret
  797. fadein endp
  798.  
  799.  
  800. ; ---------------------------------------------------------
  801. ; FADEOUT: sanftes Ausfaden der Palette
  802. ; -> SI   Offset der Tabelle
  803. ; ---------------------------------------------------------
  804. fadeout proc near
  805.          pusha
  806.  
  807.          mov cl,64                      ; 64 Abstufungen
  808. @@frame_loop:
  809.          xor bx,bx                      ; 3*256 Farben
  810. @@color_loop:
  811.          movzx ax,[bx+si]               ; Farbwert holen
  812.          mul cl                         ; neu = alt*Stufe/64
  813.          shr ax,6
  814.          mov temppalette[bx],al
  815.  
  816.          inc bx                         ; nächste Farbe
  817.          cmp bx,3*256                   ; fertig ?
  818.          jne @@color_loop
  819.  
  820.          call retrace                   ; synchronisieren
  821.          call setpalette                ; setzen
  822.  
  823.          dec cl                         ; nächste Stufe
  824.          jnz @@frame_loop
  825.  
  826.          popa
  827.          ret
  828. fadeout endp
  829.  
  830.  
  831. ; ---------------------------------------------------------
  832. ; RETRACE: wartet auf den vertikalen Retrace
  833. ; ---------------------------------------------------------
  834. retrace proc near
  835.          pusha
  836.  
  837.          mov dx,3DAh                    ; Portadresse
  838. @@warte:
  839.          in  al,dx                      ; Status lesen
  840.          and al,8                       ; nur Bit 4 interessant
  841.          jz @@warte                     ; wenn 0, dann warten
  842.  
  843.          popa
  844. retrace endp
  845.  
  846.  
  847. ; ---------------------------------------------------------
  848. ; RANDOM: liefert eine WORD-Zufallszahl zurück
  849. ; <- AX
  850. ; ---------------------------------------------------------
  851. random proc near
  852.          push dx
  853.  
  854.          imul ax,randomseed,8405h       ; 16-Bit-Algorithmus
  855.          inc ax                         ; bißchen zufälliger
  856.          mov randomseed,ax              ; Startwert ändern
  857.  
  858.          pop dx
  859.          ret
  860. random endp
  861.  
  862.  
  863. ; ---------------------------------------------------------
  864. ; Daten
  865. ; ---------------------------------------------------------
  866.    problem         db 'Advanced VESA-videomode 101h not supported by your system.',10,13
  867.                    db 'Just run a VESA-driver such as UNIVBE (especially Cirrus-Logic-cards).',10,13,'$'
  868.    cpu386          db 'Sorry, you need at least a 386.',10,13,'$'
  869.    phonenumbers    db 'This source is available at Ghost BBS.',9,9,9
  870.                    db 'VESA iNTRO done by zÅ∩',10,13
  871.                    db '   call now   +49-30-99400897',10,13
  872.                    db '         or   +49-30-99400898',10,13,'$'
  873.    phonedigital1   db 00101101b,01111011b,00101100b,00101100b,0 ; CALL
  874.                    db 01111101b,01010111b,01111101b,00000010b   ; 030-
  875.                    db 01011111b,01011111b,01011010b,01111101b   ; 9940
  876.                    db 01111101b,01111111b,01011111b,01010001b   ; 0897
  877.                    db '$'
  878.    phonedigital2   db 0,01100110b,00100010b,0                   ; or
  879.                    db 01111101b,01010111b,01111101b,00000010b   ; 030-
  880.                    db 01011111b,01011111b,01011010b,01111101b   ; 9940
  881.                    db 01111101b,01111111b,01011111b,01111111b   ; 0898
  882.                    db '$'
  883.  
  884.    randomseed      dw 286Ah
  885.  
  886.    sinustab        db   2,  5,  8, 11, 14, 17, 20, 23, 26, 29, 32, 35, 38, 41, 44, 47
  887.                    db  50, 53, 56, 58, 61, 64, 67, 69, 72, 74, 77, 79, 82, 84, 86, 89
  888.                    db  91, 93, 95, 97, 99,101,103,105,106,108,110,111,113,114,115,117
  889.                    db 118,119,120,121,122,123,124,124,125,125,126,126,127,127,127,127
  890.  
  891.    startofzeros    label byte
  892.  
  893.    cosinustab      db 64 dup (0)
  894.    cosinus_2       db 64 dup (0)
  895.    cosinus_3       db 64 dup (0)
  896.    cosinus_4       db 64 dup (0)
  897.  
  898.    infoblock       db 262 dup (0)
  899.    vesaptr         dd 0
  900.    vesaseg         dw 0
  901.  
  902.    anglex          db 0
  903.    angley          db 0
  904.    anglez          db 0
  905.    pointxtab       db stars dup (0)
  906.    pointytab       db stars dup (0)
  907.    pointztab       db stars dup (0)
  908.    screen2d        dd stars dup (0)
  909.    oldcolor        db stars dup (0)
  910.  
  911.    newpalette      db 3*256 dup (0)
  912.    originalpalette db 3*256 dup (0)
  913.    temppalette     db 3*256 dup (0)
  914.  
  915.    yoffset         dd 480 dup (0)
  916.  
  917.    endofzeros      label byte
  918.  
  919. end begin